package com.imooc;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * 2.3.1 启动类
 * @author qilongfei
 *
 */
@SpringBootApplication
@RestController
// 3.11.2 swagger注解
@EnableSwagger2
/**
 * 4.6.1 认证流程源码debug
 * *SecurityContextPersistenceFilter 77
 * 进来时候检查session，有认证信息就放到线程里
 * 出去的时候检查线程，有认证信息就放到session里
 * 这样不同的请求就可以同一个session拿到相同的认证信息
 * 
 * UsernamePasswordAuthenticationFilter 94
 * ProviderManager 174
 * AbstractUserDetailsAuthenticationProvider 144
 * DaoAuthenticationProvider 114
 * MyUserDetailsService 32 <<<
 * 
 * AbstractUserDetailsAuthenticationProvider 176
 * DefaultPreAuthenticationChecks 351
 * 
 * AbstractUserDetailsAuthenticationProvider 177
 * DaoAuthenticationProvider 94
 * BCryptPasswordEncoder 68 <<<
 * 
 * AbstractUserDetailsAuthenticationProvider 185
 * DefaultPostAuthenticationChecks 380
 * 
 * UsernamePasswordAuthenticationFilter 94
 * AbstractAuthenticationProcessingFilter 240 316 
 * SecurityContextImpl 72
 * SecurityContextHolder 132
 * 
 * AbstractAuthenticationProcessingFilter 326
 * ImoocAuthenticationSuccessHandler 45 <<<
 * 
 * AbstractAuthenticationProcessingFilter 230 352
 * ImoocAuthenticationFailureHandler 46 <<<
 */
/**
 * 5.5.6 分析源码，qq授权登录后跳转回平台qqLogin/callback.do 重定向到/signIn没权限
 * qqLogin/callback.do请求被SocialAuthenticationFilter拦截，前缀qqLogin在ImoocSpringSocialConfig自定义，后缀callback.do在QQAutoConfig定义
 * 原因：qqLogin/callback.do回调处理时，创建SocialAuthenticationToken前报异常了，根据失败处理器跳转到默认的/signIn
 * SocialAuthenticationFilter 172
 * OAuth2AuthenticationService 87
 * 
 * OAuth2AuthenticationService 97   处理qq登录后回调
 * Oauth2Template 133
 * SocialAuthenticationFilter 84
 * SocialAuthenticationFilter 361
 */
/**
 * 5.6.1 分析源码，首次第三方登录跳转到注册singup
 * 捕获到SocialAuthenticationToken后的处理，查数据库获取用户信息。首次查不到会报异常，异常重定向到注册页signup
 * SocialAuthenticationProvider 64
 * 
 * SocialAuthenticationFilter 333    如果signUpUrl配置了就跳转到注册页
 */
/**
 * 5.6.13 分析代码，实现社交首次登陆，默默为用户注册
 * toUserId(connection) 没查到东西会跳转到注册页
 * connectionSignUp不为空，就会默认建一个用户
 * SocialAuthenticationProvider 64   社交登录的时候判断用户是否存在，如果不存在则抛异常。SocialAuthenticationFilter 333跳转
 * SocialAuthenticationProvider 78
 * JdbcUsersConnectionRepository 85
 */
/**
 * 5.8.2 绑定/解绑/状态视图 源码解析
 * 因为没配置视图，所以返回pageNotFound异常
 * ConnectController 195
 * ConnectController 354
 */
/**
 * 5.9.2 源码解析 session配置成10秒，但超时未失效
 * tomcat会自动把配置的秒转换成分钟，并和1分钟进行比较取最大值
 * TomcatEmbeddedServletContainerFactory 503
 * TomcatEmbeddedServletContainerFactory 530
 */
public class DemoApplication {
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
	
	@GetMapping("/hello")
	public String hello() {
		return "hello spring security";
	}
}
